package logger

import (
	"bytes"
	"sync"
	"unsafe"
)

// BufferPool 缓存池，用于复用bytes.Buffer以实现零分配
type BufferPool struct {
	pool sync.Pool
}

// NewBufferPool 创建新的缓存池
func NewBufferPool() *BufferPool {
	return &BufferPool{
		pool: sync.Pool{
			New: func() interface{} {
				// 预分配4KB容量，减少扩容次数
				return bytes.NewBuffer(make([]byte, 0, 4096))
			},
		},
	}
}

// Get 从池中获取一个buffer
func (p *BufferPool) Get() *bytes.Buffer {
	buf := p.pool.Get().(*bytes.Buffer)
	buf.Reset() // 重置buffer内容，但保留容量
	return buf
}

// Put 将buffer归还到池中
func (p *BufferPool) Put(buf *bytes.Buffer) {
	// 如果buffer过大，不放回池中，让GC回收
	// 这样可以防止内存泄漏
	if buf.Cap() > 32*1024 { // 32KB
		return
	}
	p.pool.Put(buf)
}

// BytesToString 零分配字节切片转字符串
func BytesToString(b []byte) string {
	return *(*string)(unsafe.Pointer(&b))
}

// StringToBytes 零分配字符串转字节切片（只读）
func StringToBytes(s string) []byte {
	return *(*[]byte)(unsafe.Pointer(
		&struct {
			string
			Cap int
		}{s, len(s)},
	))
}

// WriteString 零分配写入字符串到buffer
func WriteString(buf *bytes.Buffer, s string) {
	buf.Write(StringToBytes(s))
}

// WriteInt 零分配整数写入，避免strconv.Itoa分配
func WriteInt(buf *bytes.Buffer, val int) {
	if val == 0 {
		buf.WriteByte('0')
		return
	}

	// 处理负数
	if val < 0 {
		buf.WriteByte('-')
		val = -val
	}

	// 计算数字位数
	temp := val
	digits := 0
	for temp > 0 {
		digits++
		temp /= 10
	}

	// 预分配空间
	start := buf.Len()
	for i := 0; i < digits; i++ {
		buf.WriteByte('0')
	}

	// 从右到左填充数字
	pos := buf.Len() - 1
	for val > 0 && pos >= start {
		buf.Bytes()[pos] = byte('0' + val%10)
		val /= 10
		pos--
	}
}

// WriteIntWithPadding 零分配带填充的整数写入
func WriteIntWithPadding(buf *bytes.Buffer, val, width int) {
	// 预分配足够的空间
	start := buf.Len()
	for i := 0; i < width; i++ {
		buf.WriteByte('0')
	}

	// 从右到左填充数字
	pos := buf.Len() - 1
	for val > 0 && pos >= start {
		buf.Bytes()[pos] = byte('0' + val%10)
		val /= 10
		pos--
	}
}

// WriteFloat 零分配浮点数写入
func WriteFloat(buf *bytes.Buffer, val float64, precision int) {
	// 简单实现，对于高性能场景可以进一步优化
	if val == 0 {
		buf.WriteByte('0')
		return
	}

	// 处理负数
	if val < 0 {
		buf.WriteByte('-')
		val = -val
	}

	// 整数部分
	intPart := int64(val)
	WriteInt(buf, int(intPart))

	// 小数部分
	if precision > 0 {
		buf.WriteByte('.')
		fracPart := val - float64(intPart)
		for i := 0; i < precision; i++ {
			fracPart *= 10
			digit := int(fracPart) % 10
			buf.WriteByte(byte('0' + digit))
		}
	}
}

// WriteBool 零分配布尔值写入
func WriteBool(buf *bytes.Buffer, val bool) {
	if val {
		WriteString(buf, "true")
	} else {
		WriteString(buf, "false")
	}
}

// 全局缓存池实例
var globalBufferPool = NewBufferPool()

// GetBuffer 获取全局缓存池中的buffer
func GetBuffer() *bytes.Buffer {
	return globalBufferPool.Get()
}

// PutBuffer 归还buffer到全局缓存池
func PutBuffer(buf *bytes.Buffer) {
	globalBufferPool.Put(buf)
}
